/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = postgresql_core.h                                             */
/*  NOTE      =                                                               */
/*  DATE      = 2016/01/05 by zhengxd                                         */
/******************************************************************************/
#ifndef _POSTGRESQL_CORE_H_
#define _POSTGRESQL_CORE_H_

#include "postgresql_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_postgresql {

    int i_req_resp;                        /* 数据方向 */
    int i_need_req_resp;                   /* 需要下一个包的方向 */
    int i_parsed_position;                 /* 已经解析到的位置 */
    Frbyte_Packet *p_st_data;              /* packet数据 */
    struct timeval st_start_timestamp;    /* 开始分片包的时间 */
    struct timeval st_end_timestamp;      /* 结束分片包的时间 */
} L7_fragment_postgresql;

/*
 *   L7session_postgresql 用于存放postgresql私有的session数据, 对应L7_session的p_session_private变量
 *    通用的username、session_starttime、session_stoptime
*/
typedef struct __st_L7session_postgresql {

    int i_version;                        /* 版本信息 */
    char *p_db_name;                      /* 数据库名 */
    char *p_db_user;                      /* 登陆用户名 */
    struct timeval st_login;
} L7session_postgresql;

/*
 *  DB2请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_postgresql {

    int i_req_type;                       /* TYPDEF */
    Postgresql_req_cmd *p_st_command_pre; /* 上一个Command信息 */
    Frlist_header st_command_lst;         /* Command列表 */
} L7_req_postgresql;

/*
 *  DB2响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_postgresql {

    int i_packet_len;                      /* 一个command响应的长度 */
    unsigned long ul_rows;                /* 影响行数 */
    Frlist_node *p_st_node;                /* 解析到command的位置 */
    Postgresql_req_cmd *p_st_command;      /* Command信息 */
    struct timeval st_start_timestamp;    /* 开始分片包的时间 */
    struct timeval st_end_timestamp;      /* 结束分片包的时间 */

}L7_resp_postgresql;

/*
 *  DB2私有数据
*/
typedef struct __st_L7session_postgresql_private {

    L7_fragment_postgresql *p_st_fragment;       /* 分片包数据 */
    L7session_postgresql *p_st_sess;             /* session数据 */
    L7_req_postgresql *p_st_req;                 /* request数据 */
    L7_resp_postgresql *p_st_resp;               /* 临时response信息 */
    Frhash_header *p_hash_prepare;               /* prepare数据(Sql_statement *) */
} L7session_postgresql_private;

int postgresql_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int postgresql_analysis(Conntrack *p_st_conn
                        , Apm_packet *p_st_packet
                        , Frhash_header *p_st_hash_report);

int postgresql_session_destroy(void *p_private_session);

#endif
